#Boa:Frame:Frame1

import wx
import MySQLdb
import MySQLdb.cursors
import servers
import utiles
import os
import subprocess

#directorios del sistema con aplicaciones necesarias para la correcta
#ejecucion de este script. "backup" es un directorio con el resultado
dirMYSQL = "\\wamp\\bin\\mysql\\mysql5.0.51b\\bin\\"
dirBACKUP = "backup\\"
dirWINXPsp = "\\Archivos de programa\\7-Zip\\"
dirWINXPen = "\\Program Files\\7-Zip\\"

def create(parent):
    return Frame1(parent)

[wxID_FRAME1, wxID_FRAME1BUTTON1, wxID_FRAME1BUTTON2, wxID_FRAME1LISTBOX1, 
 wxID_FRAME1PANEL1, wxID_FRAME1STATICTEXT1, wxID_FRAME1STATICTEXT2, 
 wxID_FRAME1STATICTEXT3, wxID_FRAME1STATICTEXT4, wxID_FRAME1STATICTEXT5, 
 wxID_FRAME1STATICTEXT6,
] = [wx.NewId() for _init_ctrls in range(11)]

def verificarArchivosNecesarios():
    resultado = True
    #se verifica la existencia de los archivos necesarios para la ejecucion
    #del backup: wamp instalado con mysqldum y 7-zip para comprimir archivos
    if not os.path.lexists(dirWINXPsp) and not os.path.lexists(dirWINXPen):
            aux1 = "Debe instalar 7-ZIP en su sistema\n"
            aux2 = "Descarguelo de http://www.7-zip.org/"
            mensaje = aux1 + aux2
            utiles.mensaje(None,mensaje)
            resultado = False
    directorio = dirBACKUP + "7z.exe"
    if not os.path.exists(directorio):
        aux1 = "No existe el archivo 7Z.EXE en el directorio BACKUP\n"
        aux2 = "Es necesario para comprimir los datos resguardados"
        mensaje = aux1 + aux2
        utiles.mensaje(None,mensaje)
        resultado = False
    directorio = dirMYSQL + "mysql.exe"
    if not os.path.exists(directorio):
        aux1 = "No existe el archivo MYSQL.EXE para la restauracion\n"
        aux2 = "Verifique la instalacion de WAMP y la carpeta MySQL"
        mensaje = aux1 + aux2
        utiles.mensaje(None,mensaje)
        resultado = False
    return resultado


class Frame1(wx.Frame):
    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wx.Frame.__init__(self, id=wxID_FRAME1, name='', parent=prnt,
              pos=wx.Point(306, 264), size=wx.Size(494, 177),
              style=wx.DEFAULT_FRAME_STYLE, title='Restaurar BD')
        self.SetClientSize(wx.Size(486, 150))

        self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1, name='panel1', parent=self,
              pos=wx.Point(0, 0), size=wx.Size(486, 150),
              style=wx.TAB_TRAVERSAL)

        self.button1 = wx.Button(id=wxID_FRAME1BUTTON1, label='Restaurar',
              name='button1', parent=self.panel1, pos=wx.Point(296, 112),
              size=wx.Size(75, 23), style=0)
        self.button1.Bind(wx.EVT_BUTTON, self.OnButton1Button,
              id=wxID_FRAME1BUTTON1)

        self.button2 = wx.Button(id=wxID_FRAME1BUTTON2, label='Salir',
              name='button2', parent=self.panel1, pos=wx.Point(392, 112),
              size=wx.Size(75, 23), style=0)
        self.button2.Bind(wx.EVT_BUTTON, self.OnButton2Button,
              id=wxID_FRAME1BUTTON2)

        self.listBox1 = wx.ListBox(choices=[], id=wxID_FRAME1LISTBOX1,
              name='listBox1', parent=self.panel1, pos=wx.Point(8, 8),
              size=wx.Size(248, 136), style=0)
        self.listBox1.Bind(wx.EVT_LISTBOX, self.OnListBox1Listbox,
              id=wxID_FRAME1LISTBOX1)

        self.staticText1 = wx.StaticText(id=wxID_FRAME1STATICTEXT1, label=' ',
              name='staticText1', parent=self.panel1, pos=wx.Point(272, 8),
              size=wx.Size(208, 13), style=0)
        self.staticText1.SetFont(wx.Font(8, wx.SWISS, wx.NORMAL, wx.BOLD, False,
              'Tahoma'))

        self.staticText2 = wx.StaticText(id=wxID_FRAME1STATICTEXT2, label=' ',
              name='staticText2', parent=self.panel1, pos=wx.Point(272, 24),
              size=wx.Size(208, 13), style=0)
        self.staticText2.SetFont(wx.Font(8, wx.SWISS, wx.NORMAL, wx.BOLD, False,
              'Tahoma'))

        self.staticText3 = wx.StaticText(id=wxID_FRAME1STATICTEXT3, label=' ',
              name='staticText3', parent=self.panel1, pos=wx.Point(272, 40),
              size=wx.Size(208, 13), style=0)
        self.staticText3.SetFont(wx.Font(8, wx.SWISS, wx.NORMAL, wx.BOLD, False,
              'Tahoma'))

        self.staticText4 = wx.StaticText(id=wxID_FRAME1STATICTEXT4, label=' ',
              name='staticText4', parent=self.panel1, pos=wx.Point(272, 56),
              size=wx.Size(208, 13), style=0)
        self.staticText4.SetFont(wx.Font(8, wx.SWISS, wx.NORMAL, wx.BOLD, False,
              'Tahoma'))

        self.staticText5 = wx.StaticText(id=wxID_FRAME1STATICTEXT5, label=' ',
              name='staticText5', parent=self.panel1, pos=wx.Point(272, 72),
              size=wx.Size(208, 13), style=0)
        self.staticText5.SetFont(wx.Font(8, wx.SWISS, wx.NORMAL, wx.BOLD, False,
              'Tahoma'))

        self.staticText6 = wx.StaticText(id=wxID_FRAME1STATICTEXT6, label=' ',
              name='staticText6', parent=self.panel1, pos=wx.Point(272, 88),
              size=wx.Size(208, 13), style=0)
        self.staticText6.SetFont(wx.Font(8, wx.SWISS, wx.NORMAL, wx.BOLD, False,
              'Tahoma'))

    def __init__(self, parent):
        if not verificarArchivosNecesarios():
            self.Close()
        self._init_ctrls(parent)
        self.usuario = servers.user
        self.password = servers.passwd
        self.seleccion = []
        self.listBox1.SetFocus()
        self.llenarListBox()

    def verificarExistenciaBD(self, database):
        #Logearse al mysql y verificar la conexion de las bases de datos
        #seleccionadas -> si hay problemas, avisar y volver al principio
        try:
            print "Intentando conectar a la BD",database
            conectar=MySQLdb.connect(host=servers.host, 
                        user=self.usuario, passwd=self.password, db=database, 
                        cursorclass=MySQLdb.cursors.DictCursor)
            cursor=conectar.cursor()
            print "Conexion exitosa"
        except:
            aux1 = "ERROR: no se pudo conectar con la BD " + database + "\n"
            aux2 = "Verifique: existe? wamp activo? esta autorizado?"
            mensaje = aux1 + aux2
            utiles.mensaje(None,mensaje)
            print "Conexion fallida"
            return False
        return True

    def OnButton2Button(self, event):
        self.Close()

    def buscandoArchivos(self):
        #busca los archivos en el directorio de respaldo y extrae solo los
        #archivos correspondientes a backup, aquellos comprimidos con 7z.exe
        listado = os.listdir(dirBACKUP)
        archivos = []
        for x in listado:
            if ".7z" in x:
                archivos.append(x[:-3])
        if archivos == []:
            aux1 = 'No se encontraron archivos "7zip" para restaurar.\n'
            aux2 = 'Verifique el contenido del directorio "'+dirBACKUP+'"'
            mensaje = aux1 + aux2
            utiles.mensaje(None,mensaje)
            exit()
        return archivos

    def procesarLista(self, archivos):
        #separa el nombre de la base de datos de la fecha y la hora
        #esto se hace para facilitar la lectura en pantalla al usuario
        lista = []
        for x in archivos:
            fechaHora = x[-14:]
            fecha = fechaHora[6:8] + "/" + fechaHora[4:6] + "/" + fechaHora[0:4]
            hora = fechaHora[8:10] + ":" + fechaHora[10:12] + ":" + fechaHora[12:]
            nombre = x[:-14]
            lista.append(fecha+" "+hora+" "+nombre)
        return lista

    def llenarListBox(self):
        #llena la lista con la fecha, hora y nombre de la BD que se hallaron
        #backupeadas en el directorio de Backup por defecto.
        lista = self.procesarLista(self.buscandoArchivos())
        for x in lista:
            self.listBox1.Append(x)

    def OnListBox1Listbox(self, event):
        #al seleccionar un elemento de la lista, se identifica y almacena
        lista = self.listBox1.GetItems()
        item = self.listBox1.GetSelection()
        miSeleccion = lista[item].split(" ")
        self.staticText1.SetLabel(miSeleccion[0])
        self.staticText2.SetLabel(miSeleccion[1])
        self.staticText3.SetLabel(miSeleccion[2])
        nombre = miSeleccion[2]
        fecha = miSeleccion[0][6:] + miSeleccion[0][3:5] + miSeleccion[0][0:2]
        hora = miSeleccion[1][0:2] + miSeleccion[1][3:5] + miSeleccion[1][6:8]
        self.seleccion = []
        self.seleccion.append(nombre + fecha + hora + ".7z")
        self.seleccion.append(nombre)

    def mostrar(self, texto):
        print texto
        utiles.logOperaciones(texto)
        texto = texto[:30]
        self.staticText1.SetLabel(self.staticText2.GetLabel())
        self.staticText2.SetLabel(self.staticText3.GetLabel())
        self.staticText3.SetLabel(self.staticText4.GetLabel())
        self.staticText4.SetLabel(self.staticText5.GetLabel())
        self.staticText5.SetLabel(self.staticText6.GetLabel())
        self.staticText6.SetLabel(texto)

    def OnButton1Button(self, event):
        if not self.verificarExistenciaBD(self.seleccion[1]):
            exit()
        texto =  "ATENCION !!!!\n\n"
        texto += "Esta operacion provocara la eliminacion de los\n"
        texto += "datos actuales en la Base de Datos " + self.seleccion[1] + ".\n\n"
        texto += "Si existen datos, seran sobreescritos.\n\n"
        texto += "ESTA SEGURO DE SEGUIR CON LA RESTAURACION ?"
        if not utiles.dialog2(None, texto):
            texto = "Operacion de restauracion cancelada"
            self.mostrar(texto)
            exit()
        self.button1.Show(False)
        self.button2.Show(False)

        #Descomprimiendo datos
        self.mostrar("DESCOMPRIMIENDO DATOS")
        comando = dirBACKUP + "7z.exe x -y " + dirBACKUP + self.seleccion[0]
        self.mostrar(comando)
        p = subprocess.Popen(comando, shell=True)
        p.wait()
        texto = "salida del comando 7Z.EXE: " + str(p.returncode)
        self.mostrar(texto)
        if p.returncode != 0: self.mostrarError("FALLA AL DESCOMPRIMIR")

        #sobre escribiendo los datos
        self.mostrar("RESTAURANDO LA BASE DE DATOS")
        aux1 = dirMYSQL + "mysql.exe --user=" + self.usuario + " --password=" + self.password + " "
        comando = aux1 + self.seleccion[1] + " < " + dirBACKUP + self.seleccion[0][:-3] + ".sql"
        p = subprocess.Popen(comando, shell=True)
        p.wait()
        texto = "salida del comando MYSQL: " + str(p.returncode)
        self.mostrar(texto)
        if p.returncode != 0: self.mostrarError("FALLA AL RESTAURAR")

        #borrando el archivo descomprimido
        self.mostrar("ELIMINANDO ARCHIVO sql")
        comando = "del " + dirBACKUP + self.seleccion[0][:-3] + ".sql"
        self.mostrar(comando)
        p = subprocess.Popen(comando, shell=True)
        p.wait()
        texto = "salida del comando DEL: " + str(p.returncode)
        self.mostrar(texto)
        if p.returncode != 0: self.mostrarError("FALLA AL ELIMINAR ARCHIVO 'sql'")

        self.mostrar("FIN DE LA RESTAURACION")
        self.Close()

    def mostrarError(self, texto):
        utiles.mensaje(None, texto)
        exit()
